package com.sqfw.project.knowledge.service;

import com.sqfw.framework.web.domain.AjaxResult;
import com.sqfw.project.knowledge.domain.KlContentInfo;
import com.sqfw.project.knowledge.domain.query.KlContentInfoQuery;
import com.sqfw.project.knowledge.domain.vo.KlContentInfoCountVo;
import com.sqfw.project.knowledge.domain.vo.KlContentInfoExcel;
import com.sqfw.project.system.domain.SysDictData;

import java.util.List;

/**
 * 知识模块 service
 *
 * @author tangxt
 * @date 2023-06-09
 * */
public interface KlContentService {

    /**
     * 查询知识分类
     * @return 返回知识分类
     * */
    AjaxResult getKnowledgeSortList();

    /**
     * 查询知识形式，知识来源
     * @param dictData 字典类型
     * @return
     * */
    List<SysDictData> getKnowledgeShapeList(SysDictData dictData);

    /**
     * 查询知识
     *
     * @param klId 知识主键
     * @return 知识
     */
    KlContentInfo selectKlContentInfoByKlId(String klId);

    /**
     * 添加知识数据; 是否案例(1-是；0-不是)
     * @param klContentInfo
     * @return
     * */
    AjaxResult addKlContentInfo(KlContentInfo klContentInfo);

    /**
     * 修改知识数据
     * @param klContentInfo
     * @return
     * */
    AjaxResult updateKlContentInfo(KlContentInfo klContentInfo);

    /**
     * 点击审核按钮--锁定该知识数据
     * @param klContentInfo klId id
     * @return
     * */
    AjaxResult toExamineKlContentInfo(KlContentInfo klContentInfo);

    /**
     * 点击批量审核按钮--锁定这些知识数据-List
     * @param klContentInfo  klIdList
     * @return
     * */
    AjaxResult toExamineKlContentInfoList(KlContentInfo klContentInfo);

    /**
     * 审核确定按钮
     * @param klContentInfo  klId, klContentStatus
     * @return
     * */
    AjaxResult toExamineDetermine(KlContentInfo klContentInfo);

    /**
     * 批量审核确定按钮
     * @param klContentInfo  klId, klContentStatus
     * @return
     * */
    AjaxResult toExamineDetermineList(KlContentInfo klContentInfo);

    /**
     * 在审核页面，点击返回按钮，解除该知识的锁定
     * @param klContentInfo klid 知识id
     * @return
     * */
    AjaxResult unlockKlContentInfo(KlContentInfo klContentInfo);

    /**
     * 批量解锁知识
     * @param klContentInfo klidList 知识idList
     * @return
     * */
    AjaxResult unlockKlContentInfoList(KlContentInfo klContentInfo);

    /**
     * 分页查询知识/ 导出时，不分页
     * @param klContentInfo  有模糊查询
     * @return
     * */
    List<KlContentInfo> queryKlContentInfoList(KlContentInfo klContentInfo);

    /**
     * 根据id查询知识数据
     * @param klId  知识表id
     * @return
     * */
    KlContentInfo queryKlContentInfoByKlId(String klId);

    /**
     * 查询更新周期7天前的知识，审核通过的, 过期的不查询--添加时计算出来，加一个字段：下一次更新开始时间
     * 当前时间 > 发布时间 + 半年 - 7天 ; 查询出来
     * 已失效的不查询
     * @param klContentInfo
     * @return
     * */
    List<KlContentInfo> queryUpdateCycleKlContent(KlContentInfo klContentInfo);

    /**
     * 更新周期时间到了，进行修改（核实--不修改状态，处理--修改知识状态，重新走一遍审核流程）
     * 修改更新周期的时间
     * @param klContentInfo
     * @return
     * */
    AjaxResult updateCycleKlContent(KlContentInfo klContentInfo);

    /**
     * 知识库检索接口, 分页查询
     * @param query
     * @return
     * */
    List<KlContentInfo> retrievalKlContentInfo(KlContentInfoQuery query);

    /**
     * 加点击量
     * @param klId 知识id
     * @return
     * */
    int plusKlContentHits(String klId);

    /**
     * 提交评分
     * @param query  知识id，评分
     * @return
     * */
    AjaxResult submitScore(KlContentInfoQuery query);

    /**
     * 首页查询10审核通过的知识数据展示--根据点击量排序
     * @param klContentInfo
     * @return
     * */
    List<KlContentInfo> queryHomeKlContentInfoList(KlContentInfo klContentInfo);

    /**
     * 首页查询10审核通过的知识数据展示---修改时间排序
     * @param klContentInfo
     * @return
     * */
    List<KlContentInfo> queryHomeListOrderByUpdateTime(KlContentInfo klContentInfo);


    List<KlContentInfoCountVo> countByKnowledgeSortPid(String pid);

    /**
     * 导入知识库数据
     * @param excelList 生产文件
     * @return
     * */
    AjaxResult importKlContentInfoExcel(List<KlContentInfoExcel> excelList);

    /**
     * 根据知识分类统计知识添加数量，核实数量
     * @param query
     * @return
     * */
    List<KlContentInfoCountVo> countVerifyKlContentInfo(KlContentInfoQuery query);

    /**
     * 工单模块：分页查询知识
     * @param klContentInfo 知识标题
     * @return 返回：知识标题，知识内容
     * */
    List<KlContentInfo> queryWpKlContentInfoList(KlContentInfo klContentInfo);

    /**
     * 逻辑删除
     * */
    int deleteKlContentInfoByKlId(KlContentInfo klContentInfo);

    /**
     * 物理删除
     * */
    int deleteByKlId(String klId);

    /**
     * 知识数据，查无数据，加日志
     * */
    void addKlOperationsLog(String operationsType, String param, String result, String failureReason);

    /**
     * 审核通过/不通过+审核意见
     * */
    void addKlContentStatusLog(String klId, String klContentStatus, String reviewComment,
                               String processAfterState, String statusType);

    /**
     * 建立知识/查无/纠错和文件的管理
     * @param fileIdList
     * @param klContentId
     * */
    void createAssociation(List<String> fileIdList, String klContentId);

    /**
     * 修改知识/查无/纠错和文件的管理
     * @param fileIdList
     * @param klContentId
     * */
    void updateAssociation(List<String> fileIdList, String klContentId);

    /** 去掉知识内容中的html一系列标签 */
    String filterHtml(String contents);

}
